from info.modules.home import home_blu
from flask import render_template, current_app, session, request, jsonify, abort

# 使用蓝图
from info.utils.constants import HOME_PAGE_MAX_NEWS
from info.utils.models import User, News, Category

# 首页
from info.utils.response_code import RET, error_map


@home_blu.route('/')
def index():
    # 判断用户是否已登陆
    user_id = session.get("user_id")
    user = None
    if user_id:  # 已登陆
        try:
            # 表一用户表
            user = User.query.get(user_id)
        except BaseException as e:
            current_app.logger.error(e)

    # 首页查询点击量前10的新闻
    rank_list = []
    try:
        # 表二新闻表
        rank_list = News.query.order_by(News.clicks.desc()).limit(10).all()

    except BaseException as e:
        # 异常报错记录进日志
        current_app.logger.error(e)

    # 表二新闻表中同样封装了dict字典来判断和格式转换
    rank_list = [news.to_basic_dict() for news in rank_list]



    #查询所有的分类数据
    try:
        categories=Category.query.all()
    except BaseException as e:
        #包装进日记做记录
        current_app.logger.error(e)
        return abort(500)



    # TODO #类似于标记暂停
    # 表一用户表中to_dict()/models文件夹在封装并判断成了字典和格式转换方便后边使用
    user = user.to_dict() if user else None
    return render_template("news/index.html", user=user, rank_list=rank_list, categories=categories)  #进入前段关联数据格式


# 设置网站图标（浏览器会自动向网站发起/favicon.ioc请求，后端只需要实现该路由，返回图片即可）
@home_blu.route("/favicon.ico")
def favico():
    # flask中封装了语法，可以获取静态文件的内容，并根据内容设置content—type
    response = current_app.send_static_file("news/favicon.ico")  # 相对路径基于static文件夹
    return response


#展示获取新闻列表<--------1
# @home_blu.route("/get_news_list")
# def get_news_list():
#     #获取参数
#     #这里cid传过来的都是字符串后续需要整形转换
#     cid = request.args.get("cid")
#     cur_page = request.args.get("cur_page")
#     per_count = request.args.get("per_count",HOME_PAGE_MAX_NEWS)
#
#     #校验参数
#     if not all([cid,cur_page,per_count]):
#         return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])  # 与前段定义的规则包文档
#
#     #转换成整数
#     try:
#         cid = int(cid)
#         cur_page = int(cur_page)
#         per_count = int(per_count)
#     except BaseException as e:
#         current_app.logger.error(e)
#         return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])  # 与前段定义的规则包文档
#
#     #根据分类，页码查询新闻数据      #根据新闻发布时间倒序
#     try:                #分类表的ID=新闻表ID           #那一页，每页的条数  #paginate必须再最后
#         #判断最新
#         if cid ==1:
#             pn = News.query.order_by(News.create_time.desc()).paginate(cur_page, per_count)
#
#         else:
#             #其他分类
#             pn = News.query.filter_by(category_id=cid).order_by(News.create_time.desc()).paginate(cur_page,per_count)
#     except BaseException as e:
#         #记录日记报错黑盒子
#         current_app.logger.error(e)
#         return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])  # 与前段定义的规则包文档
#
#
#     #数据包装成json返回
#     data={
#         "news_list":[news.to_basic_dict()for news in pn.items],     #列表可以放恒等式     #[]pn.items是列表模型，不能转换成一个个对象，可以转换成字典，就能得到一个个对象
#         "total_page":pn.pages       #pn.pages总页数
#     }
#     return jsonify(errno=RET.OK, errmsg=error_map[RET.OK],data=data)  # 与前段定义的规则包文档



#展示获取新闻列表<--------2
@home_blu.route("/get_news_list")
def get_news_list():
    #获取参数
    #这里cid传过来的都是字符串后续需要整形转换
    cid = request.args.get("cid")
    cur_page = request.args.get("cur_page")
    per_count = request.args.get("per_count",HOME_PAGE_MAX_NEWS)

    #校验参数
    if not all([cid,cur_page,per_count]):
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])  # 与前段定义的规则包文档

    #转换成整数
    try:
        cid = int(cid)
        cur_page = int(cur_page)
        per_count = int(per_count)
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])  # 与前段定义的规则包文档


    #根据分类，页码查询新闻数据      #根据新闻发布时间倒序1
                    #分类表的ID=新闻表ID           #那一页，每页的条数  #paginate必须再最后
    #新闻只显示通过过
    filter_list=[News.status==0]    #status = db.Column(db.Integer, default=0)  # 当前新闻状态 如果为0代表审核通过，1代表审核中，-1代表审核不通过
    if cid !=1:     #判断不是最新
        filter_list.append(News.category_id==cid)
    # 根据分类，页码查询新闻数据      #根据新闻发布时间倒序2
    try:      #其他分类             #*filter相当于是解包。接触[]列表，如果没有数据是不会执行上面if语句的
            pn = News.query.filter(*filter_list).order_by(News.create_time.desc()).paginate(cur_page,per_count)
    except BaseException as e:
        #记录日记报错黑盒子
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])  # 与前段定义的规则包文档


    #数据包装成json返回
    data={
        "news_list":[news.to_basic_dict()for news in pn.items],     #列表可以放恒等式     #[]pn.items是列表模型，不能转换成一个个对象，可以转换成字典，就能得到一个个对象
        "total_page":pn.pages       #pn.pages总页数
    }
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK],data=data)  # 与前段定义的规则包文档
